package br.ceut.especializacao.poo.fachada;

import java.util.List;

import br.ceut.especializacao.poo.autores.Autor;
import br.ceut.especializacao.poo.autores.AutorJaCadastradoException;
import br.ceut.especializacao.poo.autores.AutorNaoEncontradoException;
import br.ceut.especializacao.poo.autores.CadastroAutores;
import br.ceut.especializacao.poo.autores.RepositorioAutores;
import br.ceut.especializacao.poo.autores.RepositorioAutoresBDR;
import br.ceut.especializacao.poo.exemplares.CadastroExemplares;
import br.ceut.especializacao.poo.exemplares.Exemplar;
import br.ceut.especializacao.poo.exemplares.ExemplarJaCadastradoException;
import br.ceut.especializacao.poo.exemplares.ExemplarNaoEncontradoException;
import br.ceut.especializacao.poo.exemplares.RepositorioExemplares;
import br.ceut.especializacao.poo.exemplares.RepositorioExemplaresBDR;
import br.ceut.especializacao.poo.fornecedores.CadastroFornecedores;
import br.ceut.especializacao.poo.fornecedores.Fornecedor;
import br.ceut.especializacao.poo.fornecedores.FornecedorJaCadastradoException;
import br.ceut.especializacao.poo.fornecedores.FornecedorNaoEncontradoException;
import br.ceut.especializacao.poo.fornecedores.RepositorioFornecedores;
import br.ceut.especializacao.poo.fornecedores.RepositorioFornecedoresBDR;
import br.ceut.especializacao.poo.livros.CadastroLivros;
import br.ceut.especializacao.poo.livros.Livro;
import br.ceut.especializacao.poo.livros.LivroJaCadastradoException;
import br.ceut.especializacao.poo.livros.LivroNaoEncontradoException;
import br.ceut.especializacao.poo.livros.RepositorioLivros;
import br.ceut.especializacao.poo.livros.RepositorioLivrosBDR;
import br.ceut.especializacao.poo.util.RepositorioException;

public class Biblioteca {
	
	private CadastroAutores autores;
	private CadastroFornecedores fornecedores;
	private CadastroLivros livros;
	private CadastroExemplares exemplares;
	
	public Biblioteca(){
        initCadastros();
    }

    private void initCadastros(){
    	
        RepositorioLivros repositorioLivros = RepositorioLivrosBDR.getInstance();
        RepositorioFornecedores repositorioFornecedores = RepositorioFornecedoresBDR.getInstance();
        RepositorioAutores repositorioAutores = RepositorioAutoresBDR.getInstance();
        RepositorioExemplares repositorioExemplares = RepositorioExemplaresBDR.getInstance();
        livros = new CadastroLivros(repositorioLivros);
        fornecedores = new CadastroFornecedores(repositorioFornecedores);
        autores = new CadastroAutores(repositorioAutores);
        exemplares = new CadastroExemplares(repositorioExemplares);
    }
    
    //Livro
    public void cadastrar(Livro livro) throws LivroJaCadastradoException, RepositorioException {
        livros.cadastrar(livro);
    }
    
    public List<Livro> getLivros() throws RepositorioException {
        return livros.getLivros();
    }

	public void atualizar(Livro livro) throws RepositorioException, LivroJaCadastradoException {
		livros.atualizar(livro);
	}

    public void removerLivro(String isbn) throws LivroJaCadastradoException, RepositorioException, LivroNaoEncontradoException {
        livros.remover(isbn);
    }
    
    public Livro buscarLivro(String isbn) throws LivroJaCadastradoException, RepositorioException, LivroNaoEncontradoException {
    	return livros.buscarLivro(isbn);
    }
    
    //Forncedor
    public void cadastrar(Fornecedor fornecedor) throws FornecedorJaCadastradoException, RepositorioException {
    	fornecedores.cadastrar(fornecedor);
    }

    public void removerFornecedor(int idFornecedor) throws FornecedorJaCadastradoException, RepositorioException, FornecedorNaoEncontradoException {
    	fornecedores.remover(idFornecedor);
    }

	public List<Fornecedor> getFornecedores() throws RepositorioException {
		return fornecedores.geFornecedores();
	}
    
    
    //Autor
    public void cadastrar(Autor autor) throws AutorJaCadastradoException, RepositorioException {
    	autores.cadastrar(autor);
    }
    
    public Autor buscarAutor(int idAutor) throws AutorJaCadastradoException, RepositorioException, AutorNaoEncontradoException {
    	return autores.buscarAutor(idAutor);
    }
    public void removerAutor(int idAutor) throws AutorNaoEncontradoException, RepositorioException, LivroNaoEncontradoException {
        autores.remover(idAutor);
    }
    
    public List<Autor> getAutores() throws RepositorioException {
        return autores.getAutores();
    }
    
    public void atualizar(Autor autor) throws RepositorioException, AutorJaCadastradoException {
		autores.atualizar(autor);
	}
    
    public void removerAutores(int idAutor) throws AutorJaCadastradoException, RepositorioException, AutorNaoEncontradoException {
    	autores.remover(idAutor);
    }
    
    
    //Exemplar
    public void cadastrar(Exemplar exemplar) throws ExemplarJaCadastradoException, RepositorioException {
    	exemplares.cadastrar(exemplar);
    }
    
    public Exemplar buscarExemplar(int idExemplar) throws ExemplarJaCadastradoException, RepositorioException, ExemplarNaoEncontradoException {
    	return exemplares.buscarExemplar(idExemplar);
    }
    
    public List<Exemplar> getExemplares() throws RepositorioException {
        return exemplares.getExemplares();
    }
    
    public void atualizar(Exemplar autor) throws RepositorioException, ExemplarJaCadastradoException, ExemplarNaoEncontradoException {
    	exemplares.atualizar(autor);
	}
    
    public void removerExemplares(int idExemplar) throws ExemplarJaCadastradoException, RepositorioException, ExemplarNaoEncontradoException {
    	exemplares.remover(idExemplar);
    }

}
